package com.zhala.system.service;

import com.zhala.common.core.domain.CommonResult;
import com.zhala.common.core.domain.PageResult;
import com.zhala.system.config.MaterialItem;
import com.zhala.system.domain.ZlSteelPlate;
import com.zhala.system.domain.vo.*;

import java.util.List;
import java.util.Map;

/**
 * 钢板信息Service接口
 *
 * @author ruoyi
 * @date 2024-11-11
 */
public interface IZlSteelPlateService {
    /**
     * 查询钢板信息
     *
     * @param ID 钢板信息主键
     * @return 钢板信息
     */
    public ZlSteelPlate selectZlSteelPlateByID(String ID);

    /**
     * 查询钢板信息列表
     *
     * @param zlSteelPlate 钢板信息
     * @return 钢板信息集合
     */
    public List<ZlSteelPlate> selectZlSteelPlateList(ZlSteelPlate zlSteelPlate);

    /**
     * 新增钢板信息
     *
     * @param zlSteelPlate 钢板信息
     * @return 结果
     */
    public int insertZlSteelPlate(ZlSteelPlate zlSteelPlate);

    /**
     * 修改钢板信息
     *
     * @param zlSteelPlate 钢板信息
     * @return 结果
     */
    public int updateZlSteelPlate(ZlSteelPlate zlSteelPlate);

    /**
     * 批量删除钢板信息
     *
     * @param IDs 需要删除的钢板信息主键集合
     * @return 结果
     */
    public int deleteZlSteelPlateByIDs(String[] IDs);

    /**
     * 删除钢板信息信息
     *
     * @param ID 钢板信息主键
     * @return 结果
     */
    public CommonResult<Boolean> deleteZlSteelPlateByID(String ID);


    /**
     * 接受钢板信息并录入系统
     * <p>
     * 该方法将用户提供的钢板验收请求信息转换为系统内部的钢板对象，并将其保存到数据库中
     * 使用了对象属性拷贝、唯一标识生成和当前日期获取等工具方法，以简化数据处理过程
     *
     * @param reqVO 用户提交的钢板验收请求对象，包含需要录入系统的钢板信息
     * @return 返回一个通用结果对象，表示操作是否成功
     */
    CommonResult<Boolean> acceptance(SteelPlateAcceptanceReqVO reqVO);


    /**
     * 根据条件分页查询钢板信息
     *
     * @param reqVO 钢板分页查询请求对象，包含查询条件和分页参数
     * @return 返回分页结果对象，包含总记录数和钢板列表
     */
    PageResult<List<ZlSteelPlate>> page(SteelPlatePageReqVO reqVO);

    /**
     * 根据类型获取钢板列表
     * 此方法用于处理获取不同类型钢板列表的请求它首先规范化类型参数，
     * 然后调用mapper方法获取相应的钢板列表
     *
     * @return 返回一个包含钢板列表的CommonResult对象，表示查询结果
     */
    CommonResult<List<ZlSteelPlate>> list(PlateListReqVO reqVO);

    /**
     * 统计钢板信息
     * 该方法根据当前日期获取当月的开始和结束时间，并调用mapper层进行数据统计
     * 主要用于统计当前月份的钢板使用情况
     *
     * @return 返回一个CommonResult对象，其中包含统计结果列表
     */
    CommonResult<List<PlateStatisticsRespVO>> statistics(StatisticsReqVO reqVO);

    /**
     * 获取所有钢板材料信息
     * <p>
     * 此方法返回一个包含所有supportedMaterials的CommonResult对象
     * 主要用于获取系统中支持的所有素材项列表，可以用于展示或进一步处理
     *
     * @return CommonResult<List < MaterialItem>> 包含所有supportedMaterials的CommonResult对象
     */
    CommonResult<List<MaterialItem>> materials();

    /**
     * 获取批次号列表
     * <p>
     * 该方法用于获取所有批次号的列表，以便进行进一步的处理或展示
     * 它调用了zlSteelPlateMapper中的lstBatchNums方法来实现数据的获取
     *
     * @return 包含批次号列表的CommonResult对象
     */
    CommonResult<List<String>> listBatchNums();

    /**
     * 根据ID获取钢板的详细信息
     *
     * @param id 钢板的唯一标识符
     * @return 包含钢板信息的通用结果对象
     */
    CommonResult<ZlSteelPlate> detail(String id);


    /**
     * 获取安装位置信息
     * <p>
     * 本方法通过从配置服务中获取安装位置的配置信息，并将其解析为列表形式返回
     * 主要用于需要获取系统或者应用安装位置的场景
     *
     * @return CommonResult<List < Map>> 返回一个通用结果对象，包含解析后的安装位置列表
     */
    CommonResult<List<Map>> getInstallLocation();


    /* ================================大屏相关统计=====================================*/


    /**
     * 统计钢板库存总量
     *
     * @return
     */
    CommonResult<List<PlateMonthStatisticsVO>> monthStoreStatistics();
}
